<template><div><h2 id="过滤器与拦截器" tabindex="-1"><a class="header-anchor" href="#过滤器与拦截器"><span>过滤器与拦截器</span></a></h2>
<p><a href="https://zhuanlan.zhihu.com/p/340397290" target="_blank" rel="noopener noreferrer">Springboot过滤器和拦截器详解及使用场景 - 知乎</a></p>
<h2 id="springboot初始化api" tabindex="-1"><a class="header-anchor" href="#springboot初始化api"><span>SpringBoot初始化API</span></a></h2>
<ul>
<li>@PostConstruct注解</li>
<li>实现ApplicationRunner接口</li>
<li>实现CommandLineRunner接口</li>
<li>使用@EventListener注解监听ApplicationReadyEvent事件</li>
<li>实现SmartInitializingSingleton接口</li>
<li>实现InitializingBean接口</li>
</ul>
<blockquote>
<ul>
<li><strong>@PostConstruct</strong>：适合简单的初始化逻辑，执行时机较早。</li>
<li><strong>ApplicationRunner 和 CommandLineRunner</strong>：适合需要访问命令行参数的初始化逻辑，执行时机在 Spring Boot 应用启动完成后。</li>
<li><strong>ApplicationReadyEvent 监听器</strong>：适合在整个应用准备好后执行的初始化逻辑。</li>
<li><strong>SmartInitializingSingleton</strong>：适合需要在所有单例 bean 初始化完成后执行的初始化逻辑。</li>
<li><strong>InitializingBean</strong>：适合需要在 bean 属性设置完成后执行的初始化逻辑。</li>
</ul>
</blockquote>
<h2 id="applicationrunner" tabindex="-1"><a class="header-anchor" href="#applicationrunner"><span>ApplicationRunner</span></a></h2>
<p><a href="https://cloud.tencent.com/developer/article/1445599" target="_blank" rel="noopener noreferrer">springboot超级详细的日志配置(基于logback)-腾讯云开发者社区-腾讯云</a></p>
<h2 id="aop" tabindex="-1"><a class="header-anchor" href="#aop"><span>AOP</span></a></h2>
<p><a href="https://blog.csdn.net/TYRA9/article/details/135246932" target="_blank" rel="noopener noreferrer">Spring AOP—深入动态代理 万字详解（通俗易懂）_aop使用动态代理-CSDN博客</a></p>
<h2 id="网络模型" tabindex="-1"><a class="header-anchor" href="#网络模型"><span>网络模型</span></a></h2>
<h3 id="reactor网络模型" tabindex="-1"><a class="header-anchor" href="#reactor网络模型"><span>Reactor网络模型</span></a></h3>
<blockquote>
<p><a href="https://zhuanlan.zhihu.com/p/706640252" target="_blank" rel="noopener noreferrer">高性能网络编程之 Reactor 网络模型（彻底搞懂） - 知乎</a></p>
<p><a href="https://blog.csdn.net/sc35262/article/details/147538436" target="_blank" rel="noopener noreferrer">Reactor 模型详解：从单线程到多线程及其在 Netty 和 Redis 中的应用_redis reactor模型-CSDN博客</a></p>
<p><a href="https://cloud.tencent.com/developer/article/1811347" target="_blank" rel="noopener noreferrer">五分钟快速理解 Reactor 模型-腾讯云开发者社区-腾讯云</a></p>
</blockquote>
<h2 id="应用" tabindex="-1"><a class="header-anchor" href="#应用"><span>应用</span></a></h2>
<h3 id="写业务接口的常规规范" tabindex="-1"><a class="header-anchor" href="#写业务接口的常规规范"><span>写业务接口的常规规范</span></a></h3>
<ol>
<li>定义可能会出现的魔法值常量类</li>
<li>定义可能会出现的错误枚举</li>
<li>写业务方法</li>
</ol>
<h3 id="大文件上传" tabindex="-1"><a class="header-anchor" href="#大文件上传"><span>大文件上传</span></a></h3>
<blockquote>
<p><a href="https://zhuanlan.zhihu.com/p/344196767" target="_blank" rel="noopener noreferrer">大文件上传：秒传、断点续传、分片上传 - 知乎</a></p>
</blockquote>
<h3 id="为什么需要分布式id-分布式id要有什么特点-怎么生成分布式id" tabindex="-1"><a class="header-anchor" href="#为什么需要分布式id-分布式id要有什么特点-怎么生成分布式id"><span>为什么需要分布式ID,分布式ID要有什么特点?怎么生成分布式ID</span></a></h3>
<ol>
<li>
<p>当用户数据量过大的时候,关系型数据库,单库单表的数据量过大的时候会造成性能影响,所以需要进行分库分表,此时也就需要分布式ID了</p>
</li>
<li>
<p>唯一,有序,尽可能的短,尽可能的不可以被反推出来一些信息</p>
</li>
<li>
<p>常规有三种方式</p>
<ol>
<li>使用UUID, 优点是不依赖于其他的中间件,无磁盘/网络IO,但是是基于MAC地址生成的,有可能造成MAC地址泄漏,且UUID太长了且无序,对MySQL索引不友好</li>
<li>依赖于数据库, 在数据库中专门存储一张表,来维护自增的ID,缺点是强依赖于DB,DB一挂就容易造成重复发号的问题,且发号的性能上限为MySQL单机的读写性能上限</li>
<li>使用各大厂的开源服务,如Twitter的雪花算法,美团的Leaf</li>
<li>此外也可以依赖于Redis,Nacos,Zookeeper等中间件,缺点是将依赖于中间件,同2</li>
</ol>
</li>
</ol>
<blockquote>
<p><a href="https://tech.meituan.com/2017/04/21/mt-leaf.html" target="_blank" rel="noopener noreferrer">Leaf——美团点评分布式ID生成系统 - 美团技术团队</a></p>
</blockquote>
<h2 id="面试" tabindex="-1"><a class="header-anchor" href="#面试"><span>面试</span></a></h2>
<p><a href="https://blog.csdn.net/Sunshineoe/article/details/121244238" target="_blank" rel="noopener noreferrer">【详解】面试必问：SpringBoot自动配置原理_springboot的自动配置原理 面试-CSDN博客</a></p>
<h3 id="resource与-autowired" tabindex="-1"><a class="header-anchor" href="#resource与-autowired"><span>@Resource与@Autowired</span></a></h3>
<p>@Resource注解为jdk自带的注解, @Autowired为Spring自定义的注解,@Resource注解默认是byName,@Autowired默认是byType,@Resource有两个属性为name和type,如果指定了name属性,就走byName,如果指定type属性,就走byType. 默认都没有指定的时候,先走byName,如果没找到,就走byType,没找到允许为空.反之,@Autowired先走byType,如果找到多个在进行byName,如果没找到,不显示指定required = false的话,没找到Bean的时候会抛异常,如果想要实现@Autowired进行byName匹配,要配合@Qualifier注解使用.</p>
<blockquote>
<p><a href="https://www.cnblogs.com/lzghyh/p/13141592.html" target="_blank" rel="noopener noreferrer">@Autowired 与@Resource选择（治好你的强迫症） - 幂次方 - 博客园</a></p>
<p><a href="https://developer.aliyun.com/article/1003903" target="_blank" rel="noopener noreferrer">面试突击78：@Autowired 和 @Resource 有什么区别？-阿里云开发者社区</a></p>
</blockquote>
<h3 id="spring事务失效的几个场景" tabindex="-1"><a class="header-anchor" href="#spring事务失效的几个场景"><span>Spring事务失效的几个场景</span></a></h3>
<ul>
<li>方法可见性: 必须为public方法</li>
<li>子调用: 类内自调用也会失效</li>
<li>异常处理: 默认必须抛出RuntimeException异常才会触发事务,否则必须显示指定</li>
<li>代理对象: 直接new对象,不走代理,事务也会失效</li>
</ul>
</div></template>


